<?php
class Delivery_Model_ProductoPedido 
	extends Delivery_Model_Producto
{
	public $idPedido;
	public $cantidad;
	public $opcionesIds;
	public $opcionesCantidades;
	public $precioAdicional = 0;
	
	protected $_opcionesPedidas;
	
	public function getPrecio()
	{
		return parent::getPrecio() + $this->precioAdicional;
	}
	
    public function getPrecioTotal()
	{
		return $this->getPrecio() * $this->cantidad;
	}
	
	public function getKey()
	{
		$p = empty($this->opcionesIds) ? null : implode(':', $this->opcionesIds);
		$c = empty($this->opcionesCantidades) ? null : implode(':', $this->opcionesCantidades);
		
		if( $p ){
			$key = "{$this->idProducto}-{$p}-{$c}";
		} else {
			$key = $this->idProducto;
		}
		
		return $key;
	}
	
	public function setCombinaciones( $combinaciones )
	{
	    if( empty($combinaciones)){
	        return;
		}
	    
		if( is_string($combinaciones)){
		
			list( $opcionesIds, $opcionesCantidades) = explode( ':', $combinaciones);
		
			if(strpos($opcionesIds, "-")){
			    $combinaciones = array_combine(
    				explode( '-', $opcionesIds),
    				explode( '-', $opcionesCantidades)
    			);
			} else {
			    $combinaciones = array_combine(
    				array( $opcionesIds ),
    				array( $opcionesCantidades )
    			);
			}
        			
		}
		
		if(is_array($combinaciones)){
		    $this->opcionesIds = array_keys($combinaciones);
		    $this->opcionesCantidades = $combinaciones    ;
		}
		
		$_opciones = $this->getOpciones();
		
		if( is_null($_opciones)){
		    return;
		}
		
		$opcionesAgrupadas = $_opciones->agruparPorFamilia();

		$opcionesPedidas = new Delivery_Model_Collection_Opciones;
		
		foreach ( $opcionesAgrupadas as $grupo ){
		
			$familia= $grupo['familia'];
			$opciones= $grupo['opciones'];
			$adicional = 0;
			$total = 0;
			
			foreach ( $combinaciones as $idOpcion => $cantidad){
			
				// Controlo si me dieron una opcion valida para este producto
				if( !isset( $_opciones[$idOpcion] )){
					throw new Delivery_Model_Exception( Delivery_Model_Exception::PRODUCT_INVALID_OPCION );
				}
				
			    if( !isset( $opciones[$idOpcion] )){
					continue;
				}
				
				$total+= $cantidad;
				
				$opcion = $_opciones[$idOpcion];
				
				$opcionPedida = new Delivery_Model_OpcionPedida( (array) $opcion);
				$opcionPedida->cantidad = $cantidad;
				
				
				$opcionesPedidas->append( $opcionPedida );
			
				$this->precioAdicional+= $opcionPedida->getPrecio();
				
			}
			
			// Controlo si indico el minimo de opciones requeridas
			if( $total <  $familia->minimo ){
				throw new Delivery_Model_Exception( Delivery_Model_Exception::PRODUCT_INVALID_OPCION_MIN );
			}
			
		    // Controlo si no supero el maximo de opciones permitidas para este producto
			if( $total > $familia->maximo ){
				throw new Delivery_Model_Exception( Delivery_Model_Exception::PRODUCT_INVALID_OPCION_MAX . " $total > $familia->maximo" );
			}
		}
		
	}
	
	public function getOpcionesPedidas()
	{
        if( is_null( $this->_opcionesPedidas )){
            
            $opciones = $this->getOpciones(); 
	    
            if(is_null( $opciones )){
                return null;
            }
            
            $this->setOpcionesPedidas( $opciones );
        }
	    
	    return $this->_opcionesPedidas;
	}
	
	public function setOpcionesPedidas( $opciones )
	{
	    if( is_null( $this->opcionesIds )){
            return;
        }
	    
	    $opcionesPedidas = Delivery_Model_Factory::collection('Opciones');
	    
        foreach ($this->opcionesIds as $idOpcion){
        
           $opcion = $opciones[$idOpcion];
        
           $opcionPedida = new Delivery_Model_OpcionPedida( (array) $opcion );
           $opcionPedida->setFamilia( $opcion->getFamilia());
           $opcionPedida->cantidad = $this->opcionesCantidades[$idOpcion];
           
           $opcionesPedidas->append($opcionPedida); 
        }
	    
	    $this->_opcionesPedidas = $opcionesPedidas;
	}
}